home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / pdclk145.zip / BUFS.ASM < prev    next >
Assembly Source File  |  1992-10-03  |  4KB  |  159 lines

  1. ;        bufs.asm
  2. ;========================================================================
  3.  
  4. ; Copyright (C) 1991 by Jan.Engvald@ldc.lu.se, see file COPYING.
  5.  
  6. BUFBODYSML      equ     2*6+2+28+NBUFSMALM    ; optimized for ping length sweep
  7.  
  8. BUFSIZE     equ    4*((GIANT+DESCRLEN + 2*16 - 2*EADDR_LEN + SNAPLEN+3)/4)
  9. BUFSIZESML      equ     4*((BUFBODYSML+DESCRLEN+3)/4)
  10.  
  11. NBUFS        equ    (StackLow-BufStart-NBUFSMALM*BUFSIZESML)/BUFSIZE
  12. NBUFSMALL    equ    (StackLow-BufStart-NBUFS*BUFSIZE)/BUFSIZESML
  13.  
  14. LinkStruc    struc
  15. dNext        dw    0            ; forward link
  16. ; dNextSegm    dw    0
  17. dPrev        dw    0            ; back link
  18. ; dPrevSegm    dw    0
  19. dHomeList       dw      0                       ; list to release it to
  20. LinkStruc    ends
  21.  
  22. LinkHead    struc
  23. lNext        dw    0            ; forward link
  24. ; lNextSegm    dw    0
  25. lPrev        dw    0            ; back link
  26. ; lPrevSegm    dw    0
  27. lBufsAvail    dw    0            ; number of buffers
  28. LinkHead    ends
  29.  
  30.  
  31.  
  32. ;************************************************************************
  33. ;*        BufAlloc
  34. ;*    Output:     if OK: non-zero and BX = buffer addr
  35. ;*                        DI = pkt addr
  36. ;*    Destroys:    BX, DI, flags
  37. ;************************************************************************
  38.  
  39. BufAlloc    proc    near
  40.         mov    di,offset FreeBufs    ; free buffer chain
  41.                 jmp     short BufAl
  42.  
  43. BufAlSml:
  44.                 mov     di,offset FreeSmal
  45.   BufAl:
  46.         call    GetFromList
  47.         jz    BufAllocRet
  48.  
  49. if DEBUG
  50.         push    ax
  51.         push    cx
  52.         mov    cx,(dPtrDes-dPtrPhys)/2
  53.         lea    di,[bx].dPtrPhys
  54.         mov    ax,0aaaah        ; trash old pointers
  55.         rep    stosw
  56.         pop    cx
  57.         pop    ax
  58. endif ; DEBUG
  59.         mov    [bx].dPtrDes,bx     ; fill in descriptor ptrs
  60.         lea    di,[bx].dHwDst
  61.         mov    [bx].dPtrPhys,di    ; must be di return value
  62.   BufAllocRet:
  63.         ret
  64. BufAlloc    endp
  65.  
  66.  
  67.  
  68. ;************************************************************************
  69. ;*        GetFromList
  70. ;*    Input:        DI = listhead address
  71. ;*    Output:     if OK: non-zero and BX = buffer addr
  72. ;*    Destroys:    BX, flags
  73. ;************************************************************************
  74.  
  75. GetFromList    proc    near
  76.         xor    bx,bx            ; ensure zero flag
  77.         PushfDI
  78.  
  79.         mov    bx,[di].dNext
  80.         cmp    bx,di            ; empty list?
  81.         je    BufAlEmpty        ; - yes, bad (zero) return
  82.  
  83.         dec    [di].lBufsAvail     ; number of available bufs
  84.  
  85.         push    si
  86.         mov    si,[bx].dNext        ; - no, link off first buf
  87.         mov    [di].dNext,si
  88.         mov    [si].dPrev,di
  89.         pop    si
  90. if DEBUG
  91.         mov    [bx].dPrev,0
  92. endif ; DEBUG
  93.         PopfEI
  94.         or    bx,bx            ; non-zero (OK) return
  95.         ret
  96.  
  97.   BufAlEmpty:
  98.         PopfEI
  99.         ret
  100. GetFromList    endp
  101.  
  102.  
  103.  
  104. ;************************************************************************
  105. ;*        BufRelease
  106. ;*    Input:        BX = buffer addr
  107. ;*    Destroys:    SI, DI (but all flags are saved)
  108. ;************************************************************************
  109.  
  110. BufRelease    proc    near
  111.         mov    si,[bx].dHomeList    ; free buffer chain
  112. AddToList:
  113.         pushf
  114.         cli
  115.         mov    di,[si].dPrev        ; link in buffer
  116.         mov    [di].dNext,bx        ;   at end of chain
  117.         mov    [bx].dPrev,di
  118.         mov    [bx].dNext,si
  119.         mov    [si].dPrev,bx
  120.  
  121.         inc    [si].lBufsAvail     ; one more buf is now available
  122.         popf
  123.         ret
  124. BufRelease    endp
  125.  
  126.  
  127.  
  128. ;************************************************************************
  129. ;*        BufInit
  130. ;************************************************************************
  131.  
  132. BufInit     proc    near
  133.         mov    ax,cs
  134.         mov    ds,ax
  135.         mov    es,ax
  136.         mov    MySegm,ax
  137.         cld
  138.  
  139.         mov    cx,NBUFS
  140.         mov    bx,offset BufStart
  141.   BufInitLoop:
  142.                 mov     [bx].dHomeList,offset FreeBufs
  143.         call    BufRelease
  144.         add    bx,BUFSIZE
  145.         loop    BufInitLoop
  146.  
  147.                 mov     cx,NBUFSMALL
  148.   BufSmlLoop:
  149.                 mov     [bx].dHomeList,offset FreeSmal
  150.                 call    BufRelease
  151.                 add     bx,BUFSIZESML
  152.                 loop    BufSmlLoop
  153.  
  154.         ret
  155. BufInit     endp
  156.  
  157. ;========================================================================
  158. ;        endinclude
  159.